XInput allows up to 255 buttons
authorThomas Jaeger <ThJaeger@gmail.com>
Tue, 29 Sep 2009 05:51:44 +0000 (01:51 -0400)
committerAlexander Larsson <alexl@redhat.com>
Tue, 29 Sep 2009 12:44:18 +0000 (14:44 +0200)
Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
https://bugzilla.gnome.org/show_bug.cgi?id=588649

gdk/x11/gdkinput-x11.c
gdk/x11/gdkinput-xfree.c
gdk/x11/gdkinputprivate.h

index a423c917a01f220d5c10790769d21f4458ac8af6..73ce4ccfc1aac063514d6b9d7e7badff409dbbf1 100644 (file)
@@ -135,7 +135,8 @@ gdk_input_device_new (GdkDisplay  *display,
   gdkdev->info.has_cursor = 0;
   gdkdev->needs_update = FALSE;
   gdkdev->claimed = FALSE;
-  gdkdev->button_state = 0;
+  memset(gdkdev->button_state, 0, sizeof (gdkdev->button_state));
+  gdkdev->button_count = 0;
 
   class = device->inputclassinfo;
   for (i=0;i<device->num_classes;i++)
@@ -556,15 +557,24 @@ _gdk_input_common_other_event (GdkEvent         *event,
     {
       XDeviceButtonEvent *xdbe = (XDeviceButtonEvent *)(xevent);
 
+      g_return_val_if_fail (xdbe->button < 256, FALSE);
       if (xdbe->type == gdkdev->buttonpress_type)
        {
          event->button.type = GDK_BUTTON_PRESS;
-         gdkdev->button_state |= 1 << xdbe->button;
+         if (!(gdkdev->button_state[xdbe->button/8] & 1 << (xdbe->button%8)))
+           {
+             gdkdev->button_state[xdbe->button/8] |= 1 << (xdbe->button%8);
+             gdkdev->button_count++;
+           }
        }
       else
        {
          event->button.type = GDK_BUTTON_RELEASE;
-         gdkdev->button_state &= ~(1 << xdbe->button);
+         if (gdkdev->button_state[xdbe->button/8] & 1 << (xdbe->button%8))
+           {
+             gdkdev->button_state[xdbe->button/8] &= ~(1 << (xdbe->button%8));
+             gdkdev->button_count--;
+           }
        }
       event->button.device = &gdkdev->info;
       event->button.window = window;
index e52ef2afe9574d2df855d834416dd34063ff6d2f..695175f61ce13c83b69204905ecea959364ee429 100644 (file)
@@ -369,10 +369,11 @@ _gdk_input_grab_pointer (GdkWindow      *window,
        {
          gdkdev = (GdkDevicePrivate *)tmp_list->data;
          if (!GDK_IS_CORE (gdkdev) && gdkdev->xdevice &&
-             ((gdkdev->button_state != 0) || need_ungrab))
+             ((gdkdev->button_count != 0) || need_ungrab))
            {
              XUngrabDevice (display_impl->xdisplay, gdkdev->xdevice, time);
-             gdkdev->button_state = 0;
+             memset(gdkdev->button_state, 0, sizeof (gdkdev->button_state));
+             gdkdev->button_count = 0;
            }
 
          tmp_list = tmp_list->next;
index 217e28c002a4855925408001607ffc4aaa79a42a..aeb440e9e0504324d1579a39ecbf8f485584c05c 100644 (file)
@@ -89,7 +89,8 @@ struct _GdkDevicePrivate
   gint needs_update;
 
   /* Mask of buttons (used for button grabs) */
-  gint button_state;
+  char button_state[32];
+  gint button_count;
 
   /* true if we've claimed the device as active. (used only for XINPUT_GXI) */
   gint claimed;